<?php
namespace Pinenut;

/**
 * Контекст выполнения запроса
 * 
 * Реализует доступ к данным выполнения запроса 
 * и некоторым функциям работы с этими данными
 * Инициируется приложением и используется диспечером
 * 
 * @author Kosh
 *
 */
class Context {
	
	/**
	 * Стек запросов - ключи
	 * @var string
	 */
	public $requestsStack = array();
	
	/**
	 * Дочерние запросы - каждый элемент имеет ключ родительского запроса и массив дочерних ключей
	 * @var array
	 */
	public $childrenRequests = array();
	
	/**
	 * Основной запрос
	 * @var \Pinenut\Request
	 */
	public $mainRequest;
	
	/**
	 * Все запросы (основной, вторичные)
	 * @var unknown_type
	 */
	public $requests = array();
	
	/**
	 * Все ответы
	 * @var unknown_type
	 */
	public $responses = array();
	
	/**
	 * Текущий пользователь
	 * @var \Pinenut\Context\Auth
	 */
	public $auth = null;
	
	/**
	 * Инициируем контекст запросом
	 * @param \Pinenut\Request $mainRequest
	 */
	function __construct(\Pinenut\Request $mainRequest) {
		$this->mainRequest = $mainRequest;
		$this->auth = new \Application::$ContextAuthClass;
		//$this->addRequest($request);
		//$this->pushRequest($request);
	}
	
	/**
	 * Спускаемся внутрь дерева запросов, добавляя новый запрос на выполнение в стек
	 * @param \Pinenut\Request $request
	 * @return string
	 */
	function pushRequest(\Pinenut\Request $request) {
		$key = $request->key();
		$this->requests[$key] = $request;
		
		// для ведения дочерних элементов берём родителя и добавляем в его список вновьприбывшего
		@$this->childrenRequests[end($this->requestsStack)][] = $key;
		
		$this->requestsStack[] = $key;
		
		return $key;
	}
	
	/**
	 * Выходим уровнем выше
	 * @return string
	 */
	function popRequest() {
		return array_pop($this->requestsStack);
	}
	
	function getCurrentRequest() {
		return $this->requests[end($this->requestsStack)];
	}
	
	function getMainRequest() {
		return $this->mainRequest;
	}
	
	function addResponse(\Pinenut\Response $response) {
		$this->responses[end($this->requestsStack)] = $response;
	}
	
	function getResponse() {
		return @$this->responses[end($this->requestsStack)];
	}
	
	function getChildrenResponses() {
		$childrenRequests = @$this->childrenRequests[end($this->requestsStack)];
		$responses = array();
		if (is_array($childrenRequests)) {
			foreach ($childrenRequests as $key) {
				if (isset($this->responses[$key])) {
					$responses[] = $this->responses[$key];
				}
			}
		}
		return $responses;
	}
	
	/**
	 * Проверка прав доступа
	 * 
	 * @param string|array $privileges
	 * @return bool
	 */
	function checkAccess($privileges) {
		if (empty($privileges)) 
			return true;
		else 
			return $this->auth->checkAccess($privileges);
	}
	
}